package LRES;

/**
 * 通过隶属函数将输入值进行处理，统一变换到[0,1]范围内
 * @author paddy
 *
 */
public class MembershipFunction {

	/**
	 * 成本型(越小越好型)
	 * @param index
	 * @param min
	 * @param max
	 * @return
	 */
	public double costFunc(double index,double min,double max){
		if(index<=min)
			return 1;
		else if(index>min && index<max)
			return (max-index)/(max-min);
		else
			return 0;
	}

	/**
	 * 效益型(越大越好型)
	 * @param index
	 * @param min
	 * @param max
	 * @return
	 */
	public double benefitFunc(double index,double min,double max){
		if(index>=max)
			return 1;
		else if(index>min && index<max)
			return (index-min)/(max-min);
		else
			return 0;
	}

	/**
	 * 适中型(既不能太大又不能太小为好型)
	 * @param index
	 * @param min
	 * @param max
	 * @return
	 */
	public double modestFunc(double index,double min,double max){

		double M=(min+max)/2;

		if(index>min && index<=M)
			return 2*(index-min)/(max-min);
		else if(index>M && index<max)
			return 2*(max-index)/(max-min);
		else
			return 0;
	}

	/**
	 * 区间型(属性值在某一固定区间内为好型)
	 * v1和v2是规范化后的指标的最佳稳定区间
	 * @param index
	 * @param v1
	 * @param v2
	 * @return
	 */
	public double intervalFunc(double index,double v1,double v2,double min,double max){
		if(index<v1)
			return 1-(v1-index)/Math.max(v1-min, max-v2);
		else if(index>=v1 && index<=v2)
			return 1;
		else
			return 1-(index-v2)/Math.max(v1-min, max-v2);
	}
}
